﻿#ifndef WRWORKTCPCOMMCLIENTROUTINE_H
#define WRWORKTCPCOMMCLIENTROUTINE_H

#include "../WRWorkTcpCommDomain.h"
#include "../../WRSoft-Utility/Runtime/WRDataPacket.h"

#include <QQueue>
#include <QObject>
#include <QTcpSocket>

//声明工作TCP通讯客户端会话。
class WRWorkTcpCommClientSession;

//表示工作TCP通讯客户端例程。
class WRWorkTcpCommClientRoutine : public QObject
{
    Q_OBJECT

private:
    //枚举状态。
    enum Status
    {
        //已关闭。
        Closed,
        //连接中。
        Connecting,
        //已断开。
        Disconnected,
        //初始中。
        Initializing,
        //在线中。
        Online,
    };

    WR32s m_available;//是否可用。
    WR32s m_pulseTimer;//心跳定时器
    WR32s m_checkTimer;//检测定时器
    Status m_status;
    WR64s m_ticks;
    QTcpSocket* m_socket;
    WRWorkTcpCommDomain* m_owner;
    WRWorkTcpCommClientSession* m_session;

    //读取缓存长度。
    WR32s m_rBufLen;
    //读取数据长度。
    WR32s m_rDatLen;
    //读取缓存数组。
    char* m_rBufArr;

    //发送同步。
    QMutex m_wMutex;
    //发送数据列队。
    QQueue<WRDataPacket*> m_wQueue;
    //写入数据长度。
    WR32s m_wDatLen;
    //写入数据对象。
    WRDataPacket* m_wDatPkg;
    //写入数据状态。
    bool m_wStatus;

    //执行数据写稿操作。
    void doWritting(void);
    //处理接收到的数据，返回余下的数据长度。
    WR32s  process(const char* buf, WR32s len);

    //执行接收到的数据帧处理。
    void procData(const char* buf, WR32s len);

private slots:
    //当连接时调用此方法。
    void onConnect();
    //当出现错误后调用此方法。
    void onError(QAbstractSocket::SocketError socketError);
    //当连接后调用此方法。
    void onConnected(void);
    //当断开连接后调用此方法。
    void onDisconnected(void);
    //当数据写入后调用此方法。
    void onWritten(qint64 bytes);
    //当数据到来后调用此方法。
    void onReadyRead(void);

protected:
    //处理定时器事件。
    void timerEvent(QTimerEvent *e);

public:
    //初始化例程。
    explicit WRWorkTcpCommClientRoutine(WRWorkTcpCommDomain* owner);
    //清理当前对象所占用的相关资源。
    ~WRWorkTcpCommClientRoutine(void);

    //获取所有者。
    inline WRWorkTcpCommDomain* owner(void) const
    {
        return m_owner;
    }

    //执行写入操作。
    bool process(WRDataPacket* packet);

    //执行事件处理。
    bool event(QEvent *);
};

#endif // WRWORKTCPCOMMCLIENTROUTINE_H
